"""
GomerX 机器人自动化任务配置文件

该文件包含了GomerX智能机器人的所有配置参数，包括摄像头、视觉处理、底盘控制、
机械臂、夹爪、任务流程和日志等模块的配置。通过修改这些参数，可以调整机器人的
行为和性能，适应不同的应用场景和硬件环境。

配置文件采用字典结构组织，每个模块的配置参数都有详细的注释说明其作用和取值范围。
"""

# ==================== 摄像头配置 ====================
# 摄像头模块的配置参数，用于控制图像采集的质量和性能
CAMERA_CONFIG = {
    "resolution": (640, 480),  # 摄像头分辨率，格式为(宽度, 高度)
                               # 常见分辨率: (320,240), (640,480), (1280,720)
                               # 分辨率越高，图像越清晰，但处理速度越慢
    "fps": 30,                 # 帧率，每秒采集的图像帧数
                               # 常见值: 15, 30, 60
                               # 帧率越高，视频越流畅，但计算负担越大
    "exposure": 0,             # 曝光值，控制图像亮度
                               # 范围通常为-12到12，0为自动曝光
                               # 负值使图像变暗，正值使图像变亮
}

# ==================== 视觉处理配置 ====================
# 视觉处理模块的配置参数，用于控制图像识别算法的行为
VISION_CONFIG = {
    # 线条识别参数
    "line_detection": {
        "threshold": 100,       # 二值化阈值，用于将灰度图像转换为黑白图像
                               # 范围: 0-255，值越大，越少的像素被视为白色
                               # 增大阈值可以减少噪声，但可能丢失细线
        "min_line_length": 50,  # 最小线段长度，过滤掉过短的线段
                               # 单位: 像素，根据图像分辨率调整
                               # 增大值可以减少噪声线段，但可能丢失短线
        "max_line_gap": 20,     # 最大线段间隙，连接断开的线段
                               # 单位: 像素，根据实际线段间断情况调整
                               # 增大值可以连接更多断开的线段
        "canny_low": 50,        # Canny边缘检测低阈值
                               # 范围: 0-255，用于边缘检测的弱边缘阈值
                               # 通常设置为高阈值的1/2到1/3
        "canny_high": 150,      # Canny边缘检测高阈值
                               # 范围: 0-255，用于边缘检测的强边缘阈值
                               # 值越大，检测到的边缘越少但越明显
    },
    
    # 巡线检测参数
    "line_following": {
        "roi_ratio": 0.6,           # 感兴趣区域比例，图像下半部分的比例
                                    # 范围: 0.5-0.8，值越大检测区域越大
                                    # 增大值可以检测更远的线条，但可能增加噪声
        "adaptive_block_size": 15,  # 自适应阈值块大小
                                    # 必须为奇数，范围: 3-31
                                    # 值越大，局部区域越大，对光照变化越不敏感
        "adaptive_c": 5,            # 自适应阈值常数
                                    # 范围: 2-10，从均值中减去的常数
                                    # 值越大，二值化结果越暗
        "morph_kernel_size": 3,     # 形态学操作核大小
                                    # 必须为奇数，范围: 3-7
                                    # 值越大，去噪效果越强，但可能使线条变形
        "hough_threshold": 20,      # 霍夫变换阈值
                                    # 范围: 10-50，累加器阈值
                                    # 值越大，检测的线条越少但越可靠
        "min_line_length": 20,      # 最小线段长度
                                    # 单位: 像素，范围: 10-100
                                    # 值越大，过滤的短线段越多
        "max_line_gap": 10,         # 最大线段间隙
                                    # 单位: 像素，范围: 5-30
                                    # 值越大，连接的断线越多
        "steering_gain": 30.0,      # 转向增益
                                    # 范围: 10.0-50.0，控制转向响应强度
                                    # 值越大，转向响应越灵敏，但可能导致振荡
        "intersection_gain": 15.0,  # 交叉路口转向增益
                                    # 范围: 5.0-30.0，交叉路口时的转向响应强度
                                    # 通常小于正常转向增益，提高稳定性
        "sharp_turn_gain": 45.0,    # 急转弯转向增益
                                    # 范围: 20.0-60.0，急转弯时的转向响应强度
                                    # 通常大于正常转向增益，提高响应速度
        "sharp_turn_threshold": 30, # 急转弯角度阈值
                                    # 单位: 度，范围: 20-45
                                    # 超过此角度被认为是急转弯
        "intersection_threshold": 45 # 交叉路口角度阈值
                                    # 单位: 度，范围: 30-60
                                    # 线条角度差超过此值被认为是交叉路口
    },
    
    # 人脸检测参数
    "face_detection": {
        "scale_factor": 1.1,        # 图像缩放因子
                                    # 范围: 1.05-1.5，用于构建图像金字塔
                                    # 值越小，检测精度越高，但速度越慢
        "min_neighbors": 5,         # 最小邻居数
                                    # 范围: 3-10，保留检测框的最小邻居数
                                    # 值越大，检测结果越可靠，但可能漏检
        "min_size": (30, 30),       # 最小人脸尺寸
                                    # 格式: (宽度, 高度)，单位: 像素
                                    # 值越大，检测速度越快，但可能漏检小人脸
        "confidence_threshold": 0.7, # 置信度阈值
                                     # 范围: 0.5-0.9，人脸检测的置信度阈值
                                     # 值越大，检测结果越可靠，但可能漏检
        "eye_detection": True,       # 是否启用眼睛检测
                                     # 值: True/False，是否检测人眼
                                     # 启用可以提高人脸检测准确性，但增加计算量
        "smile_detection": True,     # 是否启用微笑检测
                                     # 值: True/False，是否检测微笑
                                     # 启用可以识别人表情，但增加计算量
        "tracking_enabled": True,    # 是否启用人脸跟踪
                                     # 值: True/False，是否跟踪检测到的人脸
                                     # 启用可以在连续帧中跟踪人脸，提高稳定性
        "max_faces": 5,              # 最大检测人脸数
                                     # 范围: 1-10，同时检测的最大人脸数
                                     # 值越大，可检测人脸越多，但计算量越大
    },
    
    # OCR文字识别参数
    "ocr_detection": {
        "preprocess": True,          # 是否启用图像预处理
                                     # 值: True/False，是否对图像进行预处理
                                     # 预处理可以提高识别率，但增加处理时间
        "blur_kernel": (5, 5),       # 模糊核大小
                                     # 格式: (宽度, 高度)，用于高斯模糊
                                     # 值越大，去噪效果越强，但可能使细节模糊
        "threshold_method": "adaptive", # 阈值化方法
                                        # 可选值: "adaptive", "otsu", "binary"
                                        # adaptive: 自适应阈值，适应光照变化
                                        # otsu: 大津法，自动计算最佳阈值
                                        # binary: 固定阈值，速度快但适应性差
        "threshold_value": 127,      # 固定阈值（当threshold_method为binary时使用）
                                     # 范围: 0-255，二值化阈值
                                     # 值越大，被视为白色的像素越多
        "morph_kernel_size": 3,      # 形态学操作核大小
                                     # 必须为奇数，范围: 3-7
                                     # 值越大，去噪效果越强，但可能使文字变形
        "min_contour_area": 100,     # 最小轮廓面积
                                     # 单位: 像素²，过滤小轮廓
                                     # 值越大，过滤的噪声越多，但可能丢失小文字
        "max_contour_area": 10000,   # 最大轮廓面积
                                     # 单位: 像素²，过滤大轮廓
                                     # 值越小，过滤的背景越多，但可能丢失大文字
        "aspect_ratio_range": (0.2, 5.0), # 宽高比范围
                                          # 格式: (最小值, 最大值)
                                          # 过滤不符合文字典型宽高比的轮廓
        "min_char_height": 10,       # 最小字符高度
                                     # 单位: 像素，过滤小字符
                                     # 值越大，过滤的噪声越多，但可能丢失小文字
        "max_char_height": 100,      # 最大字符高度
                                     # 单位: 像素，过滤大字符
                                     # 值越小，过滤的背景越多，但可能丢失大文字
        "char_grouping": True,       # 是否启用字符分组
                                     # 值: True/False，是否将相邻字符组合成单词
                                     # 启用可以提高单词识别率，但增加计算量
        "language": "eng",           # 识别语言
                                     # 可选值: "eng"(英语), "chi_sim"(简体中文)等
                                     # 需要安装对应的Tesseract语言包
        "oem": 3,                    # OCR引擎模式
                                     # 0: Tesseract only
                                     # 1: LSTM only
                                     # 2: Tesseract + LSTM
                                     # 3: Default, based on what is available
        "psm": 6                     # 页面分割模式
                                     # 6: 假设统一文本块
                                     # 7: 将图像视为单一文本行
                                     # 8: 将图像视为单个单词
                                     # 11: 稀疏文本，尽可能多的OCR
    },
    
    # 颜色识别参数 (HSV范围)
    # HSV色彩空间比RGB更适合颜色识别，对光照变化更鲁棒
    "color_detection": {
        "red": {
            "lower": [0, 120, 70],   # HSV下限值 [色调, 饱和度, 明度]
            "upper": [10, 255, 255], # HSV上限值 [色调, 饱和度, 明度]
                                    # 红色在HSV空间中跨越0度，可能需要两个范围
        },
        "blue": {
            "lower": [100, 120, 70],  # HSV下限值
            "upper": [130, 255, 255], # HSV上限值
                                     # 蓝色色调范围通常在100-130度
        },
        "green": {
            "lower": [40, 120, 70],   # HSV下限值
            "upper": [80, 255, 255],  # HSV上限值
                                     # 绿色色调范围通常在40-80度
        },
        # 可以添加更多颜色，如黄色、橙色等
    },
    
    # 物品识别参数
    "object_detection": {
        "min_contour_area": 500,   # 最小轮廓面积，过滤掉过小的区域
                                   # 单位: 像素²，根据物体大小和距离调整
                                   # 增大值可以过滤噪声，但可能丢失小物体
        "max_contour_area": 50000, # 最大轮廓面积，过滤掉过大的区域
                                   # 单位: 像素²，用于排除背景等大面积区域
                                   # 减小值可以过滤背景，但可能丢失大物体
    }
}

# ==================== LED控制配置 ====================
# LED模块的配置参数，用于控制机器人前方LED灯的颜色、亮度和效果
LED_CONFIG = {
    "max_brightness": 255,       # 最大亮度值
                                # 范围: 0-255，LED的最大亮度值
                                # 值越大，LED越亮，但功耗也越大
    "default_color": [255, 255, 255],  # 默认颜色（白色）
                                      # 格式: [R, G, B]，每个分量范围0-255
                                      # 可以根据需要修改为其他颜色
    "fade_duration": 1.0,        # 渐变效果持续时间（秒）
                                # 范围: 0.1-5.0，颜色渐变的持续时间
                                # 值越大，渐变效果越平缓，但响应越慢
    "blink_interval": 0.5,       # 闪烁间隔（秒）
                                # 范围: 0.1-2.0，闪烁的间隔时间
                                # 值越小，闪烁频率越高，但可能过于刺眼
    "police_interval": 0.5,      # 警灯效果间隔（秒）
                                # 范围: 0.2-1.0，警灯效果中红蓝切换的间隔时间
                                # 值越小，切换越快，效果越明显
    "rainbow_duration": 5.0,     # 彩虹效果持续时间（秒）
                                # 范围: 1.0-10.0，彩虹效果的完整循环时间
                                # 值越大，颜色变化越慢，效果越柔和
    "rainbow_step_duration": 0.5 # 彩虹效果中每个颜色的持续时间（秒）
                                # 范围: 0.2-1.0，彩虹效果中单个颜色的显示时间
                                # 值越大，每个颜色显示时间越长，变化越慢
}

# ==================== 底盘控制配置 ====================
# 底盘模块的配置参数，用于控制机器人的移动和导航
CHASSIS_CONFIG = {
    "speed": 0.2,              # 默认移动速度 (m/s)
                              # 范围: 0.1-1.0，根据实际环境和任务需求调整
                              # 速度越快，任务完成越快，但控制精度降低
    "turn_speed": 0.3,         # 默认转弯速度 (rad/s)
                              # 范围: 0.1-2.0，通常大于直线速度
                              # 转弯速度过快可能导致不稳定
    "line_follow": {
        "kp": 0.5,             # PID控制比例系数
                              # 比例控制，响应当前误差
                              # 值越大，响应越快，但可能导致振荡
        "ki": 0.01,            # PID控制积分系数
                              # 积分控制，消除稳态误差
                              # 值越大，消除误差能力越强，但可能导致积分饱和
        "kd": 0.1,             # PID控制微分系数
                              # 微分控制，预测未来误差趋势
                              # 值越大，阻尼效果越强，但可能放大噪声
        "target_offset": 0,    # 目标偏移量
                              # 线条相对于图像中心的目标偏移量
                              # 正值表示线条偏向右侧，负值表示偏向左侧
    }
}

# ==================== 机械臂配置 ====================
# 机械臂模块的配置参数，用于控制机械臂的运动和位置
ARM_CONFIG = {
    "default_height": 100,     # 默认高度 (mm)
                              # 机械臂在空闲或移动时的默认高度
                              # 应高于障碍物，但不宜过高影响精度
    "pick_height": 50,         # 抓取高度 (mm)
                              # 机械臂抓取物体时的高度
                              # 应接近物体表面，但避免碰撞
    "place_height": 80,        # 放置高度 (mm)
                              # 机械臂放置物体时的高度
                              # 应略高于放置表面，确保平稳放置
    "speed": 50,               # 移动速度
                              # 机械臂移动速度，单位通常为mm/s或百分比
                              # 速度越快，任务完成越快，但精度和稳定性降低
    "safe_position": [0, 0, 150],  # 安全位置坐标 [x, y, z]
                                  # 机械臂的安全位置，用于避障和初始化
                                  # x,y为水平坐标，z为垂直坐标，单位为mm
}

# ==================== 夹爪配置 ====================
# 夹爪模块的配置参数，用于控制夹爪的开合和夹持力
GRIPPER_CONFIG = {
    "open_angle": 90,          # 打开角度
                              # 夹爪完全打开时的角度，单位为度
                              # 角度越大，开口越大，可抓取更大物体
    "close_angle": 20,         # 关闭角度
                              # 夹爪关闭时的角度，单位为度
                              # 角度越小，夹持越紧，但可能损坏物体
    "force": 50,               # 夹持力
                              # 夹爪夹持物体时的力度，单位为百分比或牛顿
                              # 力度过大可能损坏物体，过小可能导致掉落
}

# ==================== 任务流程配置 ====================
# 任务流程的配置参数，用于控制自动化任务的行为和策略
TASK_CONFIG = {
    "target_color": "red",     # 目标物品颜色
                              # 要抓取的物品颜色，需在VISION_CONFIG中定义
                              # 可选值: "red", "blue", "green"等
    "item_area": "item_zone",  # 物品区域标识
                              # 物品所在区域的标识符，用于导航定位
                              # 可根据实际环境自定义，如"table", "shelf"等
    "drop_area": "drop_zone",  # 放置区域标识
                              # 物品放置区域的标识符，用于导航定位
                              # 可根据实际环境自定义，如"box", "basket"等
    "max_attempts": 3,         # 最大尝试次数
                              # 任务失败时的最大重试次数
                              # 增大值可提高任务成功率，但延长总时间
    "timeout": 30,             # 任务超时时间 (秒)
                              # 单个任务步骤的最大执行时间
                              # 应根据实际任务复杂度和机器人性能调整
}

# ==================== 日志配置 ====================
# 日志系统的配置参数，用于控制日志记录的行为和格式
LOG_CONFIG = {
    "level": "INFO",           # 日志级别
                              # 可选值: "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"
                              # DEBUG: 最详细信息，用于调试
                              # INFO: 一般信息，记录正常运行状态
                              # WARNING: 警告信息，表示潜在问题
                              # ERROR: 错误信息，表示功能异常
                              # CRITICAL: 严重错误，表示系统故障
    "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
                              # 日志格式字符串
                              # %(asctime)s: 时间戳
                              # %(name)s: 日志记录器名称
                              # %(levelname)s: 日志级别
                              # %(message)s: 日志消息
    "file": "gomerx.log",      # 日志文件名
                              # 日志文件的路径和名称
                              # 可以是相对路径或绝对路径
                              # 留空则只输出到控制台，不写入文件
}